package com.bright.hxj.cwduijie.manager;

import com.bright.hxj.cwduijie.pojo.command.BuildCommand;
import com.bright.hxj.cwduijie.pojo.command.MonthlySettledCommand;
import com.bright.hxj.cwduijie.pojo.dto.*;
import com.bright.hxj.cwduijie.pojo.po.*;
import com.bright.hxj.cwduijie.pojo.query.DuijieQuery;
import org.springframework.lang.Nullable;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Author hxj
 * @Date 2024/7/4 16:12
 * @Description
 */

public interface DataManager {

    Set<String> getZtDataKeyByCreditCodes(Set<String> tyshxydmSet, Integer years);

    /**
     * v1.8 根据zt_DATA_KEY返回统一社会信用代码
     * @param ztDataKeySet
     * @return
     */
    Set<String> getCreditCodeByZtDataKeys(Set<String> ztDataKeySet);

    @Nullable
    AccSetDto getAccSet(DuijieQuery duijieQuery);

    /**
     * 获取所有账套 根据统一社会信用代码 支持获取一个或获取多个
     * @return
     */
    List<AccSet> getAllAccSetsByTYSHXYDM(DuijieQuery duijieQuery);

    @Nullable
    AccSet getAccSetPO(DuijieQuery duijieQuery);

    List<AccSet> getAccSetsByDataKeys(DuijieQuery duijieQuery);

    /**
     * 调用DJ_ZTYJ存储过程生成月结数据
     * @param command
     */
    void executeMonthlySettled(MonthlySettledCommand command);

    /**
     * 获取财务库名称+前缀
     * @return 返回值包括点点 如by_bjaccount.. 如果没有配cwdb则返回空字符串
     */
    String getCwDBName();

    String getZcDBName();

    /**
     * 通过地区号获取地区名称 从资产库地区表
     * @return
     */
    String getDistNameByDistNo(String distNo);

    /**
     * 调用DZ_SPT
     */
    void executeSPT(Object accSet, BuildCommand buildCommand);

    /**
     * 转换账套号和ztDataKey
     * @param accSet
     * @return
     */
    List<String> getZtDataKeyByAccSets(List<Object> accSet);

    /**
     * 获取需要删除的附件
     * @param duijieQuery
     * @return
     */
    List<DjFile> getNeedDuiJieFiles(DuijieQuery duijieQuery);

    List<Map<String, Object>> getDistsByDistNoAndLevel(String distNo, Integer level);

    String getTopDistNo();

    /**
     * TODO 按省要求生成合同的省编号
     * @param contracts
     */
    void generateContractShengNo(List<Contract> contracts);

}
